# -*- coding: utf-8 -*-

from Tkinter import *
import tkMessageBox as MsgBox
import tkSimpleDialog
import xmlrpclib
import sys
import os
import threading
"""
import tkFileDialog
"""
        
"""
Numero serveur 11501 pour B52equip1
"""

"Boite de dialog pour la saisie du nom de l'utilisateur et son mot de passe"

class LoginBox(tkSimpleDialog.Dialog):
    def body(self, master):
        Label(master, text="Nom d'utilisateur:").grid(row=0)
        Label(master, text="Mot de passe:").grid(row=1)
        self.NomUtilisateur = Entry(master)
        self.MotDePasse = Entry(master,show='*')               
        self.NomUtilisateur.grid(row=0, column=1)
        self.MotDePasse.grid(row=1, column=1)
        return self.NomUtilisateur

    def apply(self):
        self.result=[self.NomUtilisateur.get(),self.MotDePasse.get()]
        pass
    
class Controleur:
    def __init__(self):             
        self.serveur =None
        self.BaseDonnees = None
        self.vue=None
        self.user=None
        self.profil=None
        self.Declencheur = []
        self.Demarre()
        pass
        
    def Demarre(self):
        self.vue=VueClient()
        self.vue.Mainloop(self,850,600)
        pass
        
    def initServeur(self,NomServeur):        
        PortServeur=':8000'
        Serveur='http://'+NomServeur+PortServeur
        self.serveur=xmlrpclib.ServerProxy(Serveur)
        pass 
     
    def ChargerVue(self,NomVue):        
        " Recuperation de la vue depuis le serveur"
        LaVue=self.serveur.RecevoirVue(NomVue)
        " Enregistrement des donnees localement"
        " Toutjours sous le nom de <NomVue>.py"
        f=open(NomVue+'.py','wb')       
        f.writelines(LaVue)
        f.close()
        pass
    
    def fonctime(self):
        self.Declencheur = self.serveur.ObtenirDeclencheur(self.user)
        print "voici " , self.Declencheur
        objtimer = threading.Timer(60.0,self.fonctime)
        objtimer.start()
        
class VueClient(object):
    def __init__(self):
        self.Vue_CreationTable=None
        self.Vue_EditionTable=None
        self.Vue_Initialisation=None
        self.VueActive=None
        self.Vue_Enregistrement=None
        self.Vue_ReglesAffaires=None
        self.Vue_SaisieClient = None
        self.Vue_SaisieChamp = None
        self.Vue_EditionRapport = None
        self.Vue_GestionGroupe = None
        self.Vue_Salaire = None
        self.Vue_VoirRapport = None
        self.Vue_Facture=None
        self.Vue_ReglesAffaireDeclencheur=None
        pass
    
    def Mainloop(self,parent,width,height):
        self.parent=parent
        self.root=Tk()
        """
        Chargement du fichier de configuration personnalisée
        Ceci n'est qu'un exemple
        """
        self.root.option_readfile('perp.cfg')
        self.x=self.root.winfo_screenwidth()/2-(width/2)
        self.y=self.root.winfo_screenheight()/2-(height/2)       
        self.root.geometry(str(width)+'x'+str(height)+'+'+str(self.x)+'+'+str(self.y))
        self.root.config(bg='Floralwhite')#'#046380')
        self.root.title("PERP")
        self.root.protocol('WM_DELETE_WINDOW',self.Quitter)
        self.menuPrincipal()
        self.root.mainloop()
        pass
        
    def __del__(self):
        del self.Vue_CreationTable
        del self.Vue_EditionTable
        del self.VueActive
        del self.Vue_Login 
        del self.Vue_Enregistrement
        try:
            os.remove('Vue_EditionTable.py')
        except: 0 
        try:
            os.remove('Vue_Enregistrement.py')
        except: 0
        try:
            os.remove('Vue_CreationTable.py')
        except: 0
        pass
    
    def menuPrincipal(self):
        self.menu = Menu(self.root)
        self.root.config(menu=self.menu)

        listeMenu=["Fichier"]

        self.barreMenu=[]
        for i in range(8):
            self.barreMenu.append(Menu(self.menu, tearoff=0))
        for i in range(len(listeMenu)):
            self.menu.add_cascade(label=listeMenu[i], menu=self.barreMenu[i])
        self.menuBD=Menu(self.menu,tearoff=0)
        self.menuBD.add_command(label='Initialisation des table',command=self.Initialisation,state='disabled')
        self.menuBD.add_command(label='Créer une table',command=self.CreationTable,state='disabled')
        self.menuBD.add_command(label='Éditer une table',command=self.EditionTable,state='disabled')
        self.menuBD.add_command(label='Visualiser Enregitrement',command=self.VoirEnregistrement,state='disabled')
        self.menuBD.add_command(label='Éditer les enregistremesnt',command=self.Enregistrement,state='disabled')
        self.menuBD.add_command(label='Saisie de données',command=self.SaisieChamps, state = 'disabled')
       
        self.menu.add_cascade(label="Base de données",menu=self.menuBD)
        self.menuAide=Menu(self.menu,tearoff=0)
        self.menuAide.add_command(label='À propos',command=None,state='disabled')
        self.barreMenu[0].add_command(label="Connexion", command=self.Connexion)
        self.barreMenu[0].add_command(label="Deconnexion", command=self.Deconnexion,state='disabled')
        self.barreMenu[0].add_command(label="Connexion Rapide", command=self.ConnexionRapide)
        self.barreMenu[0].add_separator()
        
        self.barreMenu[0].add_command(label="Quitter", command=self.Quitter)
        
        self.menuGestionUtilisateur = Menu(self.menu,tearoff=0)
        self.menuGestionUtilisateur.add_command(label = 'Mise a jour utilisateur', command = self.GestionGroupe, state = 'normal')
        self.menu.add_cascade(label="Gestion des utilisateurs",menu=self.menuGestionUtilisateur)
    
        self.menuRapport = Menu(self.menu,tearoff=0)
        self.menuRapport.add_command(label = 'Creer un rapport', command = self.EditionRapport, state = 'normal')
        self.menu.add_cascade(label="Rapport",menu=self.menuRapport)
        self.menuBD.add_command(label='Relevé de paie',command=self.Salaire, state = 'disabled')    
        self.menuBD.add_command(label='Commandes',command=self.Commandes, state = 'disabled')
        self.menuRegleAffaire = Menu(self.menu,tearoff=0)
        self.menuRegleAffaire.add_command(label='Éditer les régles daffaire',command=self.ReglesAffaires, state = 'normal')
        self.menuRegleAffaire.add_command(label='Éditer les déclencheurs',command=self.ReglesAffaires_Declencheurs, state = 'normal')
        self.menu.add_cascade(label="Regle daffaire",menu=self.menuRegleAffaire)
        self.menu.add_cascade(label="Aide",menu=self.menuAide)    
    
    def ConnexionRapide(self):
        self.parent.initServeur('localhost')
        self.InitialiserMenuRapport()
        self.parent.profil='ADMIN'
        self.parent.user='ADMIN'
        self.parent.vue.barreMenu[0].entryconfigure ( 0, state='disabled')
        self.parent.vue.barreMenu[0].entryconfigure ( 1, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 0, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 1, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 2, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 3, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 4, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 5, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 6, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 7, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 8, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 9, state='normal')

    def Commandes(self):
        if (self.Vue_Facture == None):
           self.parent.ChargerVue('Vue_Facture')
           self.Vue_Facture = __import__('Vue_Facture')
        if (self.VueActive!=None):
           self.VueActive.destroy()
           self.VueActive=None     
        self.VueActive = self.Vue_Facture.Vue_Facture(self.root,self.root,width=800,height=600)       
        pass

    def Salaire(self):
        if (self.Vue_Salaire == None):
           self.parent.ChargerVue('Vue_Salaire')
           self.Vue_Salaire = __import__('Vue_Salaire')
        if (self.VueActive!=None):
           self.VueActive.destroy()
           self.VueActive=None     
        self.VueActive = self.Vue_Salaire.CalculSalaire(self.root,self.root,width=800,height=600)       
        pass

    
    def InitialiserMenuRapport(self):
        self.menuRapport.add_separator()
        #self.menuRapport.add_separator()
        ListeMenu = self.parent.serveur.ObtenirEnregistrement('PERP_RAPPORT', ['NOM', 'REQUETE'])[1]
        for Menu in ListeMenu:
            self.menuRapport.add_command(label = Menu['NOM'], command = lambda Requete=Menu['REQUETE'] : self.AfficherRapport(Requete), state = 'normal')
    
    def ReglesAffaires_Declencheurs(self):
         if (self.Vue_ReglesAffaireDeclencheur == None):
            self.parent.ChargerVue('Vue_ReglesAffaireDeclencheur')
            self.Vue_ReglesAffaireDeclencheur  = __import__('Vue_ReglesAffaireDeclencheur')
         if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
         self.VueActive = self.Vue_ReglesAffaireDeclencheur.Vue_ReglesAffaireDeclencheur(self.root,self.parent,width=400,height=300)       
         pass
     
    def AfficherRapport(self, Requete):
         if (self.Vue_VoirRapport == None):
            self.parent.ChargerVue('Vue_VoirRapport')
            self.Vue_VoirRapport  = __import__('Vue_VoirRapport')
         if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
         self.VueActive = self.Vue_VoirRapport.Vue_VoirRapport(Requete, self.root,self.parent,width=400,height=300)       
         pass
   
    def GestionGroupe(self):
         if (self.Vue_GestionGroupe == None):
            self.parent.ChargerVue('Vue_GestionGroupe')
            self.Vue_GestionGroupe = __import__('Vue_GestionGroupe')
         if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
         self.VueActive = self.Vue_GestionGroupe.Vue_GestionGroupe(self.root,self.parent,width=400,height=300)       
         pass
    
    def EditionRapport(self):
        if (self.Vue_EditionRapport == None):
            self.parent.ChargerVue('Vue_EditionRapport')
            self.Vue_EditionRapport = __import__('Vue_EditionRapport')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_EditionRapport.Vue_EditionRapport(self.root,self.parent,width=400,height=300)       
        pass
       
    def ReglesAffaires(self):
        if (self.Vue_ReglesAffaires == None):
            self.parent.ChargerVue('Vue_ReglesAffaire')
            self.Vue_ReglesAffaires= __import__('Vue_ReglesAffaire')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_ReglesAffaires.Vue_ReglesAffaires(self.root,self.parent,width=400,height=300)       
        pass
    
    def SaisieChamps(self):
        if (self.Vue_SaisieChamp == None):
            self.parent.ChargerVue('Vue_SaisieChamps')
            self.Vue_SaisieChamp= __import__('Vue_SaisieChamps')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_SaisieChamp.VueSaisieChamps(self.root,self.parent)       
        pass
    
    def Initialisation(self):
        if (self.Vue_Initialisation ==None):
            self.parent.ChargerVue('Vue_Initialisation')
            self.Vue_Initialisation = __import__('Vue_Initialisation')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_Initialisation.VueInitialisation(self.root,self.parent,width=400,height=300)       
        pass

    def EditionTable(self):
        if (self.Vue_EditionTable ==None):
            self.parent.ChargerVue('Vue_EditionTable')
            self.Vue_EditionTable = __import__('Vue_EditionTable')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_EditionTable.VueEditionTable(self.root,self.parent)       
        pass
    
    def SaisieClient(self):
        if (self.Vue_SaisieClient ==None):
            self.parent.ChargerVue('Vue_SaisieClient')
            self.Vue_SaisieClient = __import__('Vue_SaisieClient')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_SaisieClient.VueClient(self.root,self.parent)       
        pass

    def Enregistrement(self):
        if (self.Vue_Enregistrement ==None):
            self.parent.ChargerVue('Vue_Enregistrement')
            self.Vue_Enregistrement= __import__('Vue_Enregistrement')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.Vue_Enregistrement.Vue_Enregistrement(self.root,self.parent,width=600,height=400)        
        pass
    
    def CreationTable(self):
        if (self.Vue_CreationTable ==None):
            self.parent.ChargerVue('Vue_CreationTable')
            self.Vue_CreationTable= __import__('Vue_CreationTable')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.Vue_CreationTable.VueCreationTable(self.root,self.parent)        
        pass
    
    def VoirEnregistrement(self):
        if (self.Vue_CreationTable ==None):
            self.parent.ChargerVue('Vue_VoirEnregistrement')
            self.Vue_VoirEnregistrement= __import__('Vue_VoirEnregistrement')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.Vue_VoirEnregistrement.Vue_VoirEnregistrement(self.root,self.parent)        
        pass

    def Connexion(self):
        logBox=LoginBox(self.root,title='PERP 2009 | Connexion')
        "Si jamais aucune saisie on ignore l'exception d'indice hors limite"
        try:
            if (len(logBox.result[0])>0) and (len(logBox.result[1])>0):  
                self.parent.initServeur('localhost')
                reponse=self.parent.serveur.Authentification(logBox.result[0],\
                                                                logBox.result[1])
                if (reponse[0]==1):
                    self.barreMenu[0].entryconfigure ( 0, state='disabled')
                    self.barreMenu[0].entryconfigure ( 1, state='normal')
                    self.menuBD.entryconfigure ( 0, state='normal')
                    self.menuBD.entryconfigure ( 1, state='normal')
                    self.menuBD.entryconfigure ( 2, state='normal')
                    self.menuBD.entryconfigure ( 3, state='normal')
                    self.menuBD.entryconfigure ( 4, state='normal')
                    self.menuBD.entryconfigure ( 5, state='normal')
                    self.menuBD.entryconfigure ( 6, state='normal')
                    self.parent.user=logBox.result[0]
                    self.parent.profil='TEST'
                    objtimer = threading.Timer(1.0,self.parent.fonctime)
                    objtimer.start()

                else:
                    MsgBox.showerror('PERP 2009 | Connexion','ATTENTION!\nNom de l\'utilisateur ou mot de passe non valide' )
                pass
            else:
                MsgBox.showerror('PERP 2009 | Connexion','ATTENTION!\nVeuillez remplir tout les champs!' )
        except: 0
        pass
    
    def Deconnexion(self):
        "Fermer la connection"
        self.parent.vue.barreMenu[0].entryconfigure ( 0, state='normal')
        self.barreMenu[0].entryconfigure ( 1, state='disabled')
        self.menuBD.entryconfigure ( 0, state='disabled')
        self.menuBD.entryconfigure ( 1, state='disabled')
        self.menuBD.entryconfigure ( 2, state='disabled')
        self.menuBD.entryconfigure ( 3, state='disabled')
        self.menuBD.entryconfigure ( 4, state='disabled')
        self.menuBD.entryconfigure ( 5, state='disabled')
        self.menuBD.entryconfigure ( 6, state='disabled')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None       
        self.VueActive=None                   
        try:
            self.Vue_EditionTable=None
            os.remove('Vue_EditionTable.py')
        except: 0 
        try:
            self.Vue_Enregistrement=None
            os.remove('Vue_Enregistrement.py')
        except: 0
        try:
            self.Vue_CreationTable=None
            os.remove('Vue_CreationTable.py')
        except: 0
        pass
        try:
            self.Vue_Initialisation=None
            os.remove('Vue_Initialisation.py')
        except: 0
        pass

    
    def Quitter(self):
        if MsgBox.askyesno("Attention", "Vous voulez vraiment quitter ce programme?"):
            sys.exit(0)


if __name__ == '__main__':
        controleur=Controleur()



"""
Comment ajouter une vue

Ajouter votre vue dans le fichier Vues, dans le fichier Serveur

1-L'entête de votre fichier interface 

# -*- coding: utf-8 -*-
import xmlrpclib
from BD_InterfaceBaseDonnees import *
try:
    from xTkinter import *
    # ou from Tkinter import * si vous voulez utiliser la bibliotheque standard
except:
    print >> sys.stderr, 'Le module xTkinter est  introuvable'  
    sys.exit(1)
import sys

2- __init__
class ***Nom de votre frame *** (Frame):
    def __init__(self,master,parent,**cnf):
        KeysList=cnf.keys()
        self.parent = parent
        self.master=master
        self.width=400
        self.height=200
        if ('width' in KeysList):
            self.width=cnf['width']
        if ('width' in KeysList):
            self.height=cnf['height']
        Frame.__init__(self,master,cnf)        
        
3- M�thode � ajouter
   
    def close(self):
        self.destroy()
        pass
        
6- Ajouter la commande suivante
    self.menuBD.add_command(label=***Nom afficher dans le sous-menu***,command=self.***Nom de votre vue***, state = 'disabled')
   Dans la fonction  def menuPrincipal(self):
   du fichier Vue_Principal.pyw

7- Ajouter une fonction pour lancer votre vue dans le fichier Vue_Principal.pyw

def ***Nom de votre vue***(self):
        if (self.***Nom de votre vue*** ==None):
            self.parent.ChargerVue('***Nom de votre vue***')
            self.***Nom de votre vue***= __import__('***Nom de votre vue***')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.***Nom de votre vue***.***Nom de votre vue***(self.root,self.parent,width=600,height=400)        
        pass
"""